package part21;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author wcj
 * @Date 2021/6/9 16:04
 * @Version 1.0
 */
public class Part2116 {

    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        AtomicityTest atomicityTest = new AtomicityTest();
        exec.execute(atomicityTest);
        while (true) {
            int val = atomicityTest.getValue();
            if (val % 2 != 0) {
                System.out.println(val);
                System.exit(1);
            }
        }
    }
}

/**
 * 注意，此时程序仍然会终止，虽然evenIncrement使用synchronized修饰了，但是getValue()没有，return i并不被确保同一时间只有一个线程进入
 * 因此，如果想要同步，第一时间还是应该考虑使用synchronized关键字
 */
class AtomicityTest implements Runnable {
    private int i = 0;

    public int getValue() {
        return i;
    }

    public synchronized void evenIncrement() {
        i++;
        i++;
    }

    @Override
    public void run() {
        while (true) {
            evenIncrement();
        }
    }
}
